package com.wrupple.muba.security.client.session;

import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.RequestBuilder;
import com.google.gwt.http.client.RequestBuilder.Method;
import com.google.gwt.http.client.Response;
import com.google.gwt.user.client.rpc.IsSerializable;
import com.wrupple.muba.common.domain.UserNamePasswordCredentials;

/**
 * Implements the procedure by which credentials provided by the end user are
 * propagated to one or more servers, thus "spreading the session" throughout
 * all the modules of the application
 * 
 * @author japi
 * 
 */
public interface SessionSpreadHandler extends IsSerializable {

	/**
	 * @return
	 */
	public UserNamePasswordCredentials getCredentials();

	/**
	 * @param credentials
	 */
	public void setCredentials(UserNamePasswordCredentials credentials);

	/**
	 * @return La URL del servicio de login
	 */
	public String getLoginService();

	/**
	 * @return La URL del servicio de login
	 */
	public void setLoginService(String url);

	/**
	 * llamado justo antes de crear la petición
	 */
	public abstract void prepare();

	/**
	 * llamado justo antes de hacer la petición
	 */
	public abstract void prepare(RequestBuilder req);

	/**
	 * Decides whether the login was succesful or not
	 * 
	 * @param request
	 *            sent to the server
	 * @param response
	 *            sent by the server
	 * @return true if the login was succesful
	 */
	public abstract boolean loginDecision(Request request, Response response);

	/**
	 * Llamado si la petición al servicio de login no fue exitosa, o si hubo
	 * status de error en la respuesta
	 * 
	 * @param r
	 *            null si esque la peticion no pudo ser enviada
	 * @param e
	 */
	abstract void requestFailed(Request r, Throwable e);

	/**
	 * llamado si loginDecision regresa false
	 * 
	 * @param request
	 * @param response
	 */
	abstract void loginFailed(Request request, Response response);

	/**
	 * llamado si loginDecision regresa true
	 * 
	 * @param request
	 * @param response
	 */
	abstract void loginSuccesful(Request request, Response response);

	/**
	 * el método HTTP que se usa para llamar el servicio de login
	 * 
	 * @return
	 */
	public Method getHttpMethod();
}